const {
    test_quickSort
} = require('./.logic');

function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
const topo = test_quickSort.create({
    debug: {
        code: 'ws://localhost:9503/8bi'
    },
    "name": "quickSort",
    "data": function (arg, info, root) {
        return {
            arr: [9, 5, 6, 7, 4, 2, 3, 1, 8],
        }
    },
    "methods": {
        "getMidValue": function (data, info, root) {
            let {arr,left,right} = data;
            var pivot = left,
                index = pivot + 1;
            for (var i = index; i <= right; i++) {

                // 循环中如果有任何小于参照物的，就将他交换到index的位置，然后index向右移动到下一个位置；
                if (arr[i] < arr[pivot]) {
                    swap(arr, i, index);
                    index++;
                }
            }
            /*
             * 因为每次都是交换完后index移动到下一个位置，所以在循环结束时，index仍为待交换的位置；
             * 此时索引pivot+1到index-1的元素都小于参照物arr[pivot]；
             */

            // 交换pivot和index-1索引的值之后index-1索引左边全都是小于arr[index-1]的元素；
            swap(arr, pivot, index - 1);

            // 返回index-1作为拆分子数组的分界线；
            return {
                arr,
                index: index - 1,
                left,
                right
            };
        },
        "spitArr": function ({
            arr,
            index,
            left,
            right
        }, {
            next
        }, root) {
            console.log('????????',left,index - 1);
            next({arr, left, right:index - 1});
            console.log('????????',index + 1,right);
            next({arr, left:index + 1, right});
        },
        "startNoIsSmaller": function (data, info, root) {
            
            let arr, left, right;
            if (Array.isArray(data)) {
                arr = data;
                left = 0;
                right = arr.length - 1;
            } else {
                arr = data.arr;
                left = data.left;
                right = data.right;
            }
            console.log('--*****----',left,right);

            return left < right ? 'Yes' : 'No';
        }
    },
    "onBeforeEach": function (info, root) {},
    "onAfterEach": function (info, root) {
        console.log('+')
    },
    "onStart": function (info, root) {

    },
    "onEnd": function (info, root) {
        console.log(info,'>>>??????');
    }
});
topo.$start({arr:[9, 5, 6, 7, 4, 2, 3, 1, 8],left:0,right:8})
